package cn.yudao.ymcc.mq.consumer;


import cn.yudao.ymcc.domain.MediaFile;
import cn.yudao.ymcc.result.JSONResult;
import cn.yudao.ymcc.service.IMediaFileService;
import com.alibaba.fastjson.JSONObject;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;

@Component
@RocketMQMessageListener(consumerGroup="service-media-consumer",
        topic="topic-media",
        selectorExpression="rag-media",
        messageModel = MessageModel.CLUSTERING) // 默认是集群 1个消息被一个消费者消费 MessageModel.BROADCASTING 广播 1个消息被所有的消费者消费
public class MediaConsumer implements RocketMQListener<MessageExt> {

    @Autowired
    private IMediaFileService mediaFileService;

    @Value("${media.upload-base-dir}")
    private String path;

    @Override
    public void onMessage(MessageExt message) {

        byte[] body = message.getBody();
        MediaFile mediaFile = JSONObject.parseObject(body, MediaFile.class);

        // 使用断点上传业务上传到HLS服务器
        JSONResult jsonResult = mediaFileService.handleFile2m3u8(mediaFile);
        if (jsonResult.isSuccess()){
            mediaFile.setFileStatus(MediaFile.STATUES_SUCCESS);
            String filePath = mediaFile.getFilePath();
            String[] split = filePath.split("/");
            // 删除本地的碎片文件
            File file = new File(path + split[0]);
            deleteFile(file);
        }else {
            mediaFile.setFileStatus(MediaFile.STATUES_FAILURE);
        }
        mediaFileService.updateById(mediaFile);

    }


    public void deleteFile(File file) {
        /*
         * 1.先判断当前目录是否存在，如果为flase则结束方法，如果true则就说明硬盘中存在
         */
        if (file == null || !file.exists()) {
            return;
        }
        /*
         * 2.判断是否为文件，如果为文件则直接删除
         * 3.判断当前目录是否为文件夹，如果是文件夹则获取下一目录文件listFiles
         */
        if (file.isFile()) {
            file.delete();
        } else if (file.isDirectory()) {
            File[] listFiles = file.listFiles();
            if (listFiles != null) {
                for (File file2 : listFiles) {
                    deleteFile(file2);
                }
            }
            /*
             * 4.最后将最外层文件夹删除
             */
            file.delete();
        }

    }
}
